<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        // ES2017-es8 提供 async|await语法糖功能,针对promise进行调用优化
        //         ==> 进一步将 Promise 的链式语法转换为 类同步代码
        function getPromise(){
            return new Promise(function(resolve,reject){
                setTimeout(function(){
                    // resolve("resolve参数")
                    // reject("执行错误")
                    reject( new Error("执行错误") )
                },3000)
            })
        }

        // getPromise()
        //     .then(
        //         function(){
        //             console.log("执行resolve")
        //         },
        //         function(){
        //             console.log("执行reject")
        //         }
        //     )

        // console.log(1)
        // getPromise()
        //     .then(
        //         function(params){
        //             console.log("执行resolve:",params)
        //             console.log(2)
        //             console.log(3)
        //             console.log(4)
        //         }
        //     )
        //     .catch(
        //         function(){
        //             console.log("执行reject")
        //         }
        //     )
            
        // 标准同步代码
        // function show(){
        //     console.log(1)
        //     aaaaa
        //     console.log(2)
        //     console.log(3)
        // }
        // show();

        // async 只能描述方法 -> 通知JS该方法内部可能会出现 promise 语法操作 
        //                   -> 为await 提供执行环境
        //                   -> async 修饰的方法无论内部如何执行，都会返回promise对象
        // await 只能在具有 async 描述的方法内部使用 
        //                   -> 描述当前代码可能是promise执行代码
        //                   -> 如果被修饰的代码确实为promise执行代码，await会等待该promise执行完成后，再执行后续代码
        //                   -> await 等待的promise如果执行成功，resolve的参数将作为 await的返回值进行返回
        //                   -> await 等待的promise如果执行失败，会直接在JS程序中提示运行错误，错误的处理参考JS的同步代码错误的处理方式

        async function execPromise(){
            try {
                console.log(1)
                // await Math.ceil(101.22);
                let params = await getPromise()
                console.log("执行resolve:",params)
                console.log(2)
                console.log(3)
                console.log(4)
            } catch (error) {
                console.log(error)
            }
        }
        execPromise();
        
    </script>
</head>
<body>
    
</body>
</html>